package timing;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.Scanner;
import java.util.concurrent.TimeUnit;

class Zadanko {
	String nazwa = "";
	String czas = "";
	static ArrayList<Zadanko> zadaniaDnia = new ArrayList<Zadanko>();

	public Zadanko(String nazwa) {
		this.nazwa = nazwa;
		zadaniaDnia.add(this);
	}

}

public class WyliczanieDziennychTimesheets {
	Zadanko ostatnieZadanko = null;
	static String czasRozpoczeciaS = "";
	static String czasZakonczeniaS = "";
	static SimpleDateFormat simpleDateFormat = new SimpleDateFormat("HH:mm:ss");
	static boolean przerwy = false;
	static String czyPrzerwy = "";
	static long czasOdDo = 0;
	static String czasLacznyPrzerwS = "";
	static long czasLacznyPrzerw = 0;
	static long czasFaktyczny = 0;

	// 09:00:00
	// 17:00:00

	// 02:00:00
	// 01:00:00
	// 01:30:00

	public static void main(String[] args) {

		wyswietlPowitanie();
		pobierzCzasRozpoczeciaZakonczenia();
		// wyliczCzasOdDo
		pobierzEwentualnyCzasPrzerw();
		// zamienStringNaLiczbeLong
		// formatZSekundamiStatic
		wyswietlDziennyCzasPracy();
		// formatZSekundamiStatic

		pobierzWykonywaneZadania();
		// dodajZadanie()
		podajCzasDlaZadan();
		wyswietlWstepnaRozpiske();
		// obliczSumeCzasuZadan
			

	}

	private static void wyswietlPowitanie() {
		System.out.println("Witam! Pomogę Ci wypełnić Redmine za dziś");
	}

	private static void pobierzCzasRozpoczeciaZakonczenia() {
		Scanner scan = new Scanner(System.in);
		System.out.println("Podaj czas rozpoczęcia (jeśli to pominiesz, przyjmuję Twój default, czyli 09:30:00)");

		czasRozpoczeciaS = scan.nextLine();
		if (czasRozpoczeciaS.equalsIgnoreCase("")) {
			czasRozpoczeciaS = "09:30:00";
		}

		System.out.println("Podaj czas zakończenia (jeśli to pominiesz, przyjmuję Twój default, czyli 17:30:00)");

		czasZakonczeniaS = scan.nextLine();
		if (czasZakonczeniaS.equalsIgnoreCase("")) {
			czasZakonczeniaS = "17:30:00";
		}
		czasOdDo = wyliczCzasOdDo(czasRozpoczeciaS, czasZakonczeniaS);
		System.out.println("Dzięki! Generalnie praca w godz. " + czasRozpoczeciaS + "-" + czasZakonczeniaS + ", czyli " + formatZSekundamiStatic(czasOdDo));
	}

	private static long wyliczCzasOdDo(String czas1, String czas2) {
		Date start = null;
		Date end = null;
		try {
			start = simpleDateFormat.parse(czas1);
			end = simpleDateFormat.parse(czas2);
		} catch (ParseException e) {
			e.printStackTrace();
		}
		return (end.getTime() - start.getTime());
	}

	private static void pobierzEwentualnyCzasPrzerw() {
		System.out.println("Czy były nieciągłości? np. prywatne wyjścia albo przemieszczanie? Podaj T lub N");
		Scanner scan = new Scanner(System.in);
		czyPrzerwy = scan.nextLine();

		if (czyPrzerwy.equalsIgnoreCase("T")) {
			przerwy = true;
			System.out.println("Podaj łączny czas przerw");
			Scanner scan2 = new Scanner(System.in);
			czasLacznyPrzerwS = scan2.nextLine();

			czasLacznyPrzerw = zamienStringNaLiczbeLong(czasLacznyPrzerwS); // konwersja
			System.out.println("OK, łączny czas przerw to " + formatZSekundamiStatic(czasLacznyPrzerw));
		} else if (czyPrzerwy.equalsIgnoreCase("N")) {
			System.out.println("OK, nie było przerw - będzie prościej");
		}
	}

	private static void wyswietlDziennyCzasPracy() {
		czasFaktyczny = czasOdDo - czasLacznyPrzerw;
		System.out.println("Dzięki! czyli dzienny czas pracy to " + formatZSekundamiStatic(czasFaktyczny));
	}

	private static void pobierzWykonywaneZadania() {
		dodajZadanie();
	}

	private static void dodajZadanie() {
		System.out.println("Podaj wykonywane zadanie");
		Scanner scan = new Scanner(System.in);
		Zadanko ostatnieZadanko = new Zadanko(scan.nextLine());

		System.out.println("Było więcej? Podaj T lub N");
		String moreThanOne = scan.nextLine();

		if (moreThanOne.equalsIgnoreCase("T")) {
			System.out.println("OK, dodaj następne ");
			pobierzWykonywaneZadania();
		} else if (moreThanOne.equalsIgnoreCase("N")) {
			System.out.println("OK, dodano już wszystkie wykonywane dziś zadania ");
		}
	}

	private static void podajCzasDlaZadan() {
		Scanner scan = new Scanner(System.in);
		for (Zadanko z : Zadanko.zadaniaDnia) {
			System.out.println(z.nazwa + " - podaj czas:");
			z.czas = scan.nextLine();
		}
		System.out.println("Dzięki! Podano czasy");
		for (Zadanko z : Zadanko.zadaniaDnia) {
			System.out.println(z.nazwa + " - " + z.czas);

		}
	}

	private static void wyswietlWstepnaRozpiske() {

		long suma = obliczSumeCzasuZadan();

		if (suma == czasFaktyczny) {
			System.out.println("Łączny czas zadań: " + formatZSekundamiStatic(suma));
			System.out.println("Faktyczny dzienny czas pracy: " + formatZSekundamiStatic(czasFaktyczny));
			System.out.println("Jest ok. Możesz wpisać do Redmine");
			wyswietlRozpiskeDoWpisaniaDoRedmine();

		} else if (suma < czasFaktyczny) {

			long reszta = czasFaktyczny - suma;
			System.out.println("Łączny czas zadań: " + formatZSekundamiStatic(suma));
			System.out.println("Faktyczny dzienny czas pracy: " + formatZSekundamiStatic(czasFaktyczny));
			System.out.println("Nie zgadza się - zostało " + formatZSekundamiStatic(reszta) + " do zagospodarowania. Wpisz czasy jeszcze raz");
			// wyczyscCzasyZadan();
			podajCzasDlaZadan();
			wyswietlWstepnaRozpiske();
		}

		else if (suma > czasFaktyczny) {
			System.out.println("Łączny czas zadań: " + formatZSekundamiStatic(suma));
			System.out.println("Faktyczny dzienny czas pracy: " + formatZSekundamiStatic(czasFaktyczny));
			long reszta = suma - czasFaktyczny;
			System.out.println("Nie zgadza się - wpisano za dużo o " + formatZSekundamiStatic(reszta) + " do zagospodarowania. Wpisz czasy jeszcze raz");
			// wyczyscCzasyZadan();
			podajCzasDlaZadan();
			wyswietlWstepnaRozpiske();
		}

	}

	private static long obliczSumeCzasuZadan() {
		long sumaZadan = 0;

		for (Zadanko z : Zadanko.zadaniaDnia) {
			sumaZadan += zamienStringNaLiczbeLong(z.czas);

		}
		return sumaZadan;
	}

	/*
	 * private static void wyczyscCzasyZadan() { for (Zadanko z :
	 * Zadanko.zadaniaDnia) { z.czas = ""; } }
	 */

	private static void wyswietlRozpiskeDoWpisaniaDoRedmine() {
		for (Zadanko z : Zadanko.zadaniaDnia) {
			// System.out.println(z.nazwa + " - " +
			// skonwertujDoubleToString(zaokraglijDoPolGodzinyNaPotrzebyRedmine(skonwertujStringToLong(z.czas))));
			//System.out.println(z.nazwa + " - " + skonwertujDoubleToString(zaokraglijDoPolGodzinyNaPotrzebyRedmine(zamienStringNaLiczbeLong(z.czas))));
			System.out.println(z.nazwa + " - " + skonwertujDoubleToString(zamienCzasWMilisekundachNaDziesietnyDouble(zamienStringNaLiczbeLong(z.czas))));
		}
		//System.out.println("Total dzienny:" + skonwertujDoubleToString(zaokraglijDoPolGodzinyNaPotrzebyRedmine(czasFaktyczny)));
		System.out.println("Total dzienny:" + skonwertujDoubleToString(zamienCzasWMilisekundachNaDziesietnyDouble(czasFaktyczny)));
		
	}

	static long zamienStringNaLiczbeLong(String czas) {
		// System.out.println(WyliczanieDziennychTimesheets.konwertujStringToLong("1,5"));
		// // EXP. 5400000
		// 1800000 = 0.5 hour
		// 3600000 = 1 hour
		// 5400000 = 1,5 h
		//System.out.println("podano: " + czas);
		long poszukiwanyCzas = 0;
		long polgodziny = 0;
		long godziny = 0;
		int indexUlamka = 0;
		if (czas.length() == 8) {
			poszukiwanyCzas = skonwertujStringToLong(czas);
			//System.out.println("poszukiwanyCzas: " + poszukiwanyCzas);
		}

		else {
			if (czas.contains(",")) {
				czas = czas.replace(",", ".");

			}

			if (czas.contains(".")) {
				indexUlamka = czas.indexOf(".");

	

				String godzinys = czas.substring(0, indexUlamka);
				//System.out.println("godzinys: " + godzinys);
				String ulamki = czas.substring(indexUlamka + 1);

				//System.out.println("ulamki: " + ulamki);

				godziny = Long.parseLong(godzinys) * 3600000;
				//System.out.println("godziny: " + godziny);

				if (ulamki != "") {
					polgodziny = Long.parseLong(ulamki) * 3600000 * 1 / 10;

				}

				//System.out.println("polgodziny: " + polgodziny);
				poszukiwanyCzas = godziny + polgodziny;
			}

			else {
				poszukiwanyCzas = Long.parseLong(czas) * 3600000;
		

			}

			/*
			 * if (ulamki == "") { polgodziny = 0; }
			 * 
			 * else { long x = 60 / Double.parseDouble(ulamki);
			 * System.out.println(x);
			 * 
			 * double x2 = 100 / x * 0.01; System.out.println(x2); polgodziny =
			 * x2; }
			 */

			

			// poszukiwanyCzas = (long) czasTemp * 3600000;
			System.out.println("poszukiwanyCzas: " + poszukiwanyCzas);
		}
		return poszukiwanyCzas;

	}

	public static long skonwertujStringToLong(String times) {
		long time = 0;

		/*
		 * 1000 = 1 second 60000 = 1 minute 3600000 = 1 hour
		 */

		String godzins = times.substring(0, 1);

		long godzin = Long.valueOf(times.substring(0, 2)).longValue(); // gdy
																		// bez
																		// ułamka,
																		// jest
																		// NumberFormatException!!!
		String minuts = times.substring(3, 5);
		long minut = Long.valueOf(times.substring(3, 5)).longValue();

		String sekunds = times.substring(6, 8);
		long sekund = Long.valueOf(times.substring(6, 8)).longValue();

		time = godzin * 3600000 + minut * 60000 + sekund * 1000;
		return time;
	}

	public static double zamienCzasWMilisekundachNaDziesietnyDouble(long time) {

		/*
		 * 1000 = 1 second 60000 = 1 minute 3600000 = 1 hour 1800000 = 0.5 hour
		 * 900000 = 0.25 hour = kwadrans
		 */

		// zamienCzasWMilisekundachNaDouble(3600000) -> 1.0
		// zamienCzasWMilisekundachNaDouble(5400000) -> 1.5

		double suma = 0;
		double hr = time / 3600000; // w godzinach
		//System.out.println("hr w double: " + hr);
		long reszta = time % 3600000 / 60000; // w minutach
		//System.out.println("reszta min w minutach: " + reszta); // reszta = 30

		double polgodziny = 0;

		if (reszta == 0) {
			polgodziny = 0;
		} else {
			double x = 60 / reszta;
			System.out.println(x);

			double x2 = 100 / x * 0.01;
			System.out.println(x2);
			polgodziny = x2;
		}

		//System.out.println("polgodziny: " + polgodziny);
		suma = hr + polgodziny;
		//System.out.println("suma: " + suma);
		return suma;
	}

	private static String formatZSekundamiStatic(final long time) {
		final long hr = TimeUnit.MILLISECONDS.toHours(time);
		final long min = TimeUnit.MILLISECONDS.toMinutes(time - TimeUnit.HOURS.toMillis(hr));
		final long sec = TimeUnit.MILLISECONDS.toSeconds(time - TimeUnit.HOURS.toMillis(hr) - TimeUnit.MINUTES.toMillis(min));
		return String.format("%02d:%02d:%02d", hr, min, sec);
	}

	public static String skonwertujDoubleToString(double time) {
		String times = String.valueOf(time);

		String ile = times.replace(".", ",");
		String fin = "";
		String sub = ile.substring(ile.length() - 1);

		if (sub.equalsIgnoreCase("0")) {
			fin = ile.substring(0, ile.length() - 2);

		} else {
			fin = ile;
		}
		return fin;
	}
/*
	public static double zaokraglijDoPolGodzinyNaPotrzebyRedmine(long time) {

		final long hr = TimeUnit.MILLISECONDS.toHours(time);
		double total = (double) hr;

		final long min = TimeUnit.MILLISECONDS.toMinutes(time - TimeUnit.HOURS.toMillis(hr));
		final long sec = TimeUnit.MILLISECONDS.toSeconds(time - TimeUnit.HOURS.toMillis(hr) - TimeUnit.MINUTES.toMillis(min));

		long calychMinut = 0;
		long min2 = min;

		if (sec > 30) {
			calychMinut = 1;
			min2 = min2 + calychMinut;
		}

		double polGodziny = 0;

		// 20 min = 0 h
		// 30 min = 0,5 h
		// 50 min = 1 h

		if (min2 >= 25 && min2 <= 45) {
			polGodziny = 0.5;
		}

		else if (min2 > 45) {
			polGodziny = 1;
		}

		double zaokraglone = total + polGodziny;
		return zaokraglone;
	}*/
}
